공유 메모리
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
공유 메모리는 컴퓨터 시스템에서 여러 프로세스 또는 스레드가 동일한 메모리 영역에 접근하여 데이터를 공유하는 기술을 의미한다.
하드웨어 측면에서 공유 메모리는 멀티프로세서 시스템에서 여러 CPU가 접근할 수 있는 RAM 블록을 의미하며, UMA, NUMA, COMA 등의 시스템 유형이 있다. 이러한 시스템은 프로그래밍이 용이하지만, 캐시 메모리 사용으로 인한 접근 시간 지연 및 데이터 일관성 문제 등의 단점이 존재한다. 소프트웨어 측면에서 공유 메모리는 프로세스 간 통신(IPC)의 한 방법으로, 빠른 데이터 교환을 가능하게 하지만, 동일한 컴퓨터에서 실행되어야 한다는 제약과 캐시 일관성 문제로 인한 확장성 제한이 있다. 공유 메모리는 가상 메모리 매핑을 통해 메모리 공간을 절약하는 데에도 사용되며, 공유 라이브러리와 XIP(제자리 실행)에 활용된다.
운영 체제별로 공유 메모리 지원 방식이 다르며, 유닉스 계열 시스템은 POSIX 표준 API를 제공하고, 윈도우는 CreateFileMapping 및 MapViewOfFile 함수를 사용하여 공유 메모리를 구현한다. 프로그래밍 언어는 운영 체제에서 제공하는 함수를 호출하거나, C++의 Boost.Interprocess, Qt의 QSharedMemory, .NET Framework의 MemoryMappedFile과 같은 라이브러리를 통해 공유 메모리를 지원한다.
더 읽어볼만한 페이지
- 병행 컴퓨팅 - 슈퍼컴퓨터
슈퍼컴퓨터는 일반 컴퓨터보다 훨씬 높은 성능을 가진 컴퓨터로, 복잡한 계산과 시뮬레이션을 수행하며, 프로세서, 메모리, 스토리지, 네트워크 등으로 구성되어 병렬 처리를 통해 높은 성능을 구현하고, 군사, 기상 예측, 과학 기술 분야, 인공지능 등 다양한 분야에서 활용되고 있다. - 병행 컴퓨팅 - 프로세스
프로세스는 컴퓨터에서 실행되는 프로그램의 인스턴스로, 운영 체제가 시스템 자원을 효율적으로 관리하며 멀티태스킹 환경에서 독립적인 실행 흐름을 유지한다. - 프로세스 간 통신 - Ajax
Ajax는 웹 페이지 전체를 새로고침하지 않고 비동기적으로 서버와 통신하여 웹 애플리케이션의 일부를 업데이트하는 웹 개발 기술로, XMLHttpRequest 객체의 등장으로 가능해졌으며 HTML, CSS, DOM, JavaScript, JSON 등의 기술을 통합하여 동적인 사용자 인터페이스를 구현한다. - 프로세스 간 통신 - D-Bus
D-Bus는 2002년에 시작된 프로세스 간 통신 시스템으로, 시스템 버스와 세션 버스를 통해 정보 공유, 모듈성, 권한 격리를 제공하며, 일대일 요청-응답 및 발행/구독 통신 방식을 지원한다. - 병렬 컴퓨팅 - 슈퍼컴퓨터
슈퍼컴퓨터는 일반 컴퓨터보다 훨씬 높은 성능을 가진 컴퓨터로, 복잡한 계산과 시뮬레이션을 수행하며, 프로세서, 메모리, 스토리지, 네트워크 등으로 구성되어 병렬 처리를 통해 높은 성능을 구현하고, 군사, 기상 예측, 과학 기술 분야, 인공지능 등 다양한 분야에서 활용되고 있다. - 병렬 컴퓨팅 - 컴퓨터 클러스터
컴퓨터 클러스터는 여러 대의 상용 컴퓨터를 고속 네트워크로 연결하여 고성능 컴퓨팅 시스템을 구축하는 방식으로, 슈퍼컴퓨터를 포함한 다양한 분야에서 높은 가용성과 확장성을 제공하며, 클러스터 미들웨어를 통해 시스템 관리, 부하 분산, 통신 방식, 데이터 공유 등을 지원하고 노드 장애 관리를 위한 펜싱 기술을 활용한다.
공유 메모리 | |
---|---|
공유 메모리 | |
유형 | 메모리 관리 기술 |
설명 | 여러 프로그램이 동시에 접근할 수 있는 메모리 영역 |
주요 특징 | |
프로세스 간 통신 | 프로세스 간 데이터를 효율적으로 공유 |
성능 향상 | 데이터 복사 오버헤드 감소 |
동기화 필요 | 데이터 일관성을 위해 필요 |
사용 사례 | |
멀티프로세싱 | 여러 프로세스가 데이터를 공유하며 작업을 분담 |
운영체제 | 커널 내부에서 프로세스 간 통신에 사용 |
데이터베이스 | 캐시 및 데이터 공유에 사용 |
이미지 편집 | 대용량 이미지 데이터 공유 및 처리 |
구현 방식 | |
운영체제 지원 | 운영체제에서 제공하는 API를 통해 구현 |
POSIX | shm_open, mmap 등의 함수 사용 |
System V | shmget, shmat 등의 함수 사용 |
장단점 | |
장점 | 빠른 데이터 공유 낮은 오버헤드 |
단점 | 동기화 문제 보안 문제 |
보안 고려 사항 | |
접근 제어 | 접근 권한 설정을 통해 무단 접근 방지 |
데이터 보호 | 데이터 무결성 유지를 위한 동기화 메커니즘 필요 |
프로그래밍 언어 지원 | |
C/C++ | POSIX 또는 System V API 사용 |
Python | multiprocessing 모듈 또는 mmap 모듈 사용 |
Java | MappedByteBuffer 클래스 사용 |
관련 기술 | |
메시지 큐 | 프로세스 간 비동기 통신에 사용 |
파이프 | 프로세스 간 단방향 데이터 통신에 사용 |
소켓 | 네트워크를 통한 프로세스 간 통신에 사용 |
주의 사항 | |
메모리 누수 | 공유 메모리 해제 실패 시 발생 가능 |
경쟁 조건 | 여러 프로세스가 동시에 데이터에 접근할 때 발생 가능 |
예제 코드 (C++) | |
공유 메모리 생성 | shm_open 함수 사용 |
메모리 매핑 | mmap 함수 사용 |
데이터 접근 및 수정 | 매핑된 메모리 주소를 통해 접근 |
메모리 해제 | shm_unlink 함수 사용 |
2. 하드웨어에서의 공유 메모리
컴퓨터 하드웨어에서 공유 메모리는 멀티프로세서 컴퓨터 시스템에서 여러 중앙 처리 장치(CPU)가 접근할 수 있는, 일반적으로 큰 랜덤 액세스 메모리(RAM) 블록을 가리킨다.
공유 메모리는 프로그래밍이 비교적 쉽고, 프로세서 간 통신이 빠르다는 장점이 있지만, 여러 CPU가 메모리에 동시에 접근하려 할 때 경합이 발생하거나 캐시 일관성 문제가 발생할 수 있다. 이러한 문제점을 완화하기 위해 크로스바 스위치, 오메가 네트워크, 하이퍼트랜스포트, 프런트 사이드 버스 등의 기술이 사용된다.
HSA에서는 CPU와 GPU와 같이 서로 다른 유형의 프로세서가 공유 메모리를 사용하며, CPU의 메모리 관리 장치(MMU)와 GPU의 입출력 메모리 관리 장치(IOMMU)는 공통된 주소 공간을 가진다. 최신 GPU는 VRAM에 확보되는 전역 메모리 외에, 스레드 블록 내에서만 접근 가능한 공유 메모리(로컬 메모리)를 가지고 있다. 이 공유 메모리는 용량은 작지만 속도가 빠르며, CUDA, OpenCL, DirectCompute와 같은 API를 통해 활용할 수 있다.[12]
2. 1. 공유 메모리 시스템의 유형
공유 메모리 시스템은 다음과 같은 유형으로 나눌 수 있다.[1]- UMA: 모든 프로세서가 물리적 메모리를 균등하게 공유한다.
- NUMA: 메모리 접근 시간은 프로세서에 대한 메모리 위치에 따라 달라진다.
- COMA: 각 노드의 프로세서에 대한 로컬 메모리는 실제 주 메모리가 아닌 캐시로 사용된다.
HSA는 CPU의 MMU와 GPU의 IOMMU가 동일한 페이징 가능한 가상 주소 공간을 가지는 특수한 경우의 메모리 공유를 정의한다.[24]
2. 2. 하드웨어 공유 메모리의 문제점
공유 메모리 시스템은 모든 프로세서가 데이터를 공유하고 프로세서 간의 통신이 같은 위치에 대한 메모리 접근만큼 빠를 수 있으므로 프로그래밍하기가 비교적 쉽다. 그러나 공유 메모리 시스템에는 다음과 같은 문제점이 있다.- '''접근 시간 저하''': 여러 프로세서가 같은 메모리 위치에 접근하려고 하면 경합이 발생한다. 근처 메모리 위치에 접근하려고 하면 허위 공유가 발생할 수 있다. 공유 메모리 컴퓨터는 확장이 잘 안 된다. 대부분 10개 이하의 프로세서를 가지고 있다.[1]
- '''데이터 일관성 부족''': 다른 프로세서에서 사용할 수 있는 정보로 하나의 캐시가 업데이트될 때마다 변경 사항을 다른 프로세서에 반영해야 한다. 그렇지 않으면 서로 다른 프로세서가 일관성이 없는 데이터를 사용하여 작업하게 된다. 이러한 캐시 일관성 프로토콜은 제대로 작동하면 여러 프로세서 간에 공유 정보에 대한 매우 높은 성능의 접근을 제공할 수 있다. 반면에 때로는 과부하가 걸려 성능 병목 현상이 될 수 있다.[1]
크로스바 스위치, Omega_network|오메가 네트워크영어, 하이퍼트랜스포트, 또는 프런트 사이드 버스와 같은 기술을 사용하여 병목 현상 효과를 완화할 수 있다.[1]
2. 3. 이종 시스템 아키텍처 (HSA)
HSA는 CPU와 GPU와 같이 서로 다른 유형의 프로세서가 공유 메모리를 사용하는 환경을 의미한다.[24] HSA 환경에서 CPU의 MMU와 GPU의 IOMMU는 공통 주소 공간과 같은 특정 특성을 공유한다.[24] 특히, CPU의 MMU와 GPU의 IOMMU는 동일한 형태의 페이징이 가능한 가상 주소 공간을 보유한다.[24]3. 소프트웨어에서의 공유 메모리
컴퓨터 소프트웨어에서 '''공유 메모리'''는 다음 두 가지 중 하나를 의미한다.
- 프로세스 간 통신(IPC) 기술: 동시에 실행되는 프로그램 간에 데이터를 교환하는 방법이다. 하나의 프로세스가 메모리 상에 다른 프로세스도 접근할 수 있는 영역을 생성한다.
- 메모리 공간 절약 방법: 가상 메모리 매핑을 사용하거나 프로그램의 명시적 지원을 통해, 데이터 복사본을 줄여 메모리 공간을 절약한다. 주로 공유 라이브러리나 제자리 실행(XIP)에서 사용된다.
두 프로세스는 공유 메모리 영역에 일반 메모리처럼 접근할 수 있어, 다른 IPC 방법(이름있는 파이프, 소켓, 공통 객체 요청 브로커 아키텍처 등)에 비해 매우 빠른 통신 방법이다. 그러나 프로세스가 같은 컴퓨터에서 실행되어야 하고, 별도 CPU에서 실행될 경우 캐시 일관성 등에 주의해야 한다.
공유 메모리는 자체 보호 기능이 없어, 여러 프로세스에서 동시에 접근할 수 있다. 따라서 세마포어나 락 등을 이용해 경합을 피해야 한다.
3. 1. 프로세스 간 통신 (IPC)
공유 메모리는 프로세스 간 통신(IPC)의 한 방법으로, 동시에 실행되는 프로그램 간에 데이터를 교환하는 데 사용된다. 하나의 프로세스가 생성한 RAM 영역 (공유 메모리 영역)에 다른 프로세스들이 접근하여 데이터를 주고받을 수 있다.두 프로세스 모두 공유 메모리 영역에 일반적인 작업 메모리처럼 접근할 수 있기 때문에, 이는 매우 빠른 통신 방법이다 (명명된 파이프, 유닉스 도메인 소켓 또는 CORBA와 같은 다른 IPC 메커니즘과는 대조적이다).[2] 공유 메모리는 프로그램 간에 데이터를 주고받는 효율적인 수단이다.
하지만, 다음과 같은 제약 조건 및 주의 사항이 있다.
- 통신하는 프로세스가 동일한 컴퓨터에서 실행되어야 한다. (다른 IPC 방법 중 컴퓨터 네트워크를 사용할 수 있는 것은 인터넷 도메인 소켓뿐이다.)
- 메모리를 공유하는 프로세스가 별도의 CPU에서 실행되고 기본 아키텍처가 캐시 일관성이 없는 경우 문제를 피하도록 주의해야 한다.
공유 메모리 자체는 보호 기능을 갖지 않으므로, 여러 프로세스에서 불확정적인 타이밍으로 접근될 수 있다. 따라서, 세마포어나 락 등을 사용하여 경합을 회피해야 한다.
공유 메모리를 통한 IPC는 예를 들어, 다음과 같은 곳에서 활용된다.
- 유닉스 시스템의 애플리케이션과 X 서버 간 이미지 전송
- Windows의 구성 요소 개체 모델 라이브러리에서 `CoMarshalInterThreadInterfaceInStream`에서 반환된 `IStream` 객체 내부
- Oracle 등의 데이터베이스 (Unix 버전 Oracle에서는 SGA라고 불리는 공유 메모리 공간에 데이터베이스 버퍼 캐시가 위치하여 여러 프로세스에서 접근하게 하여 성능 향상을 도모한다.)
프로세스 간의 통신이 FIFO인 스트림형의 경우, 이름있는 파이프도 통신 수단으로 검토해야 한다.
3. 2. 메모리 공간 절약
가상 메모리 매핑을 사용하거나 프로그램의 명시적 지원을 통해, 데이터 복사본을 줄여 메모리 공간을 절약할 수 있다. 이는 공유 라이브러리와 제자리 실행(XIP)에 주로 사용된다.[2]동적 라이브러리는 보통 메모리에 한 번만 올라가 여러 프로세스에 매핑된다. 개별 프로세스에 맞게 수정해야 하는 페이지(기호가 다르게 해석되는 경우)만 복제되며, 일반적으로 카피 온 라이트 메커니즘을 사용해 쓰기가 발생할 때 해당 페이지를 투명하게 복사한 후 개인 복사본에서 쓰기를 수행한다.[2]
3. 3. 공유 메모리 사용의 장단점
두 프로세스 모두 공유 메모리 영역에 일반적인 작업 메모리처럼 접근할 수 있기 때문에, 이는 매우 빠른 통신 방법이다 (명명된 파이프, 유닉스 도메인 소켓 또는 CORBA와 같은 다른 IPC 메커니즘과는 대조적이다).[2] 반면에, 통신하는 프로세스가 동일한 컴퓨터에서 실행되어야 하고 (다른 IPC 방법 중 인터넷 도메인 소켓만, 유닉스 도메인 소켓은 컴퓨터 네트워크를 사용할 수 없음) 메모리를 공유하는 프로세스가 별도의 CPU에서 실행되고 기본 아키텍처가 캐시 일관성이 없는 경우 문제를 피하도록 주의해야 하므로 확장성이 떨어진다.[2]프로세스 간의 통신이 FIFO인 스트림형의 경우, 이름있는 파이프도 통신 수단으로 검토해야 한다. 일반적으로 공유 메모리 자체는 보호 기능을 갖지 않으므로 동작은 빠르다. 그러나 공유되는 메모리는 불확정적인 타이밍으로 여러 프로세스에서 접근될 수 있다. 경합을 피하기 위해서는 세마포어나 락 등으로 경합을 회피해야 한다.[2]
4. 운영체제별 공유 메모리 지원
마이크로소프트 윈도우에서는 `CreateFileMapping` 및 `MapViewOfFile` 함수를 사용하여 여러 프로세스에서 파일의 영역을 메모리에 매핑할 수 있다.[8]
Win32 API의 `CreateFileMapping()` 함수를 사용하여 공유 메모리(메모리 맵 파일)를 생성할 수 있다.[17] 클라이언트 측 프로세스는 `OpenFileMapping()` 함수를 사용하여 호스트 측 프로세스에서 생성된 공유 메모리의 핸들을 얻을 수 있으며, `MapViewOfFile()` 함수를 사용하여 공유 메모리를 각 프로세스의 주소 공간에 매핑할 수 있다.
Windows API에는 `CreateSharedMemory()`[18][19] 등 "-SharedMemory"라는 이름을 가진 함수가 있지만, 이는 보안 관련 API이며 메모리 공유를 위한 API는 아니다.
4. 1. 유닉스 계열 시스템
POSIX는 공유 메모리 사용을 위한 표준 API인 ''POSIX 공유 메모리''를 제공하며, `sys/mman.h`의 `shm_open` 함수를 사용한다.[3] POSIX 프로세스 간 통신(POSIX:XSI 확장의 일부)에는 `shmat`, `shmctl`, `shmdt` 및 `shmget` 공유 메모리 함수가 포함된다.[4][5]`shm_open`으로 생성된 공유 메모리는 영구적이다. 즉, 프로세스에 의해 명시적으로 제거될 때까지 시스템에 남아있다. 이는 프로세스가 충돌하여 공유 메모리를 정리하지 못할 경우 시스템 종료 시까지 남아있다는 단점이 있다.
POSIX는 또한 파일을 메모리에 매핑하기 위한 `mmap` API를 제공하며, 매핑을 공유하여 파일의 내용을 공유 메모리로 사용할 수 있다.
2.6 커널 이상을 기반으로 하는 리눅스 배포판은 RAM 디스크 형태로 `/dev/shm`을 공유 메모리로 제공하며, 보다 구체적으로는 메모리에 저장된 모든 시스템 사용자가 파일을 생성할 수 있는 월드-쓰기 가능 디렉토리이다. RedHat과 데비안 기반 배포판 모두 기본적으로 이를 포함한다. 이러한 유형의 RAM 디스크 지원은 커널 구성 파일 내에서 완전히 선택 사항이다.[7]
안드로이드는 자체 개발한 ashmem (익명 공유 메모리)을 사용한다. 메모리가 부족할 때 커널이 해제하는 구조가 있으며, 해제되지 않도록 하려면 `ashmem_pin_region()`을 사용하여 지정한다.
4. 2. 윈도우
마이크로소프트 윈도우에서는 여러 프로세스에서 파일의 영역을 메모리에 매핑하기 위해 `CreateFileMapping` 및 `MapViewOfFile` 함수를 사용할 수 있다.[8]Win32 API의 `CreateFileMapping()` 함수를 사용하여 공유 메모리(메모리 맵 파일)를 생성할 수 있다.[17] 클라이언트 측 프로세스는 `OpenFileMapping()` 함수를 사용하여 호스트 측 프로세스에서 생성된 공유 메모리의 핸들을 얻을 수 있다. 공유 메모리를 각 프로세스의 주소 공간에 매핑하려면 `MapViewOfFile()` 함수를 사용한다.
Windows API에는 `CreateSharedMemory()`[18][19] 등 "-SharedMemory"라는 이름을 가진 함수가 있지만, 이는 보안 관련 API이며, 메모리 공유를 위한 API는 아니다. 이를 메모리 공유에 사용하면 리소스를 대량으로 소비하고 시스템 리소스를 소진할 수 있다.
5. 프로그래밍 언어별 공유 메모리 지원
C/C++의 경우, POSIX API를 사용하여 공유 메모리 영역을 생성하고 접근할 수 있다. 또한, 부스트(Boost)의 Boost.Interprocess 라이브러리[9]나 Qt의 QSharedMemory 클래스[10], POCO C++ Libraries의 Poco::SharedMemory[21]와 같이 공유 메모리 기능에 대한 이식 가능하고 객체 지향적인 접근을 제공하는 라이브러리도 있다.
PHP는 POSIX 함수와 유사하게 공유 메모리를 생성하는 API를 제공한다.[11][22]
.NET Framework에서는 버전 4부터 `System.IO.MemoryMappedFiles.MemoryMappedFile` 클래스[23]를 통해 공유 메모리 기능을 사용할 수 있다. .NET Core나 Xamarin (Mono)을 사용하면 Windows 이외의 플랫폼에서도 이 기능을 활용할 수 있다.
참조
[1]
서적
Advanced Computer Architecture and Parallel Processing
Wiley-Interscience
[2]
논문
Sharing and Protection in a Single Address Space Operating System
https://homes.cs.was[...]
[3]
웹사이트
Documentation of shm_open
http://www.opengroup[...]
[4]
서적
Unix systems programming: communication, concurrency, and threads
https://archive.org/[...]
Prentice Hall PTR
2011-05-13
[5]
웹사이트
Shared memory facility
http://www.opengroup[...]
[6]
웹사이트
Android Kernel Features
https://elinux.org/A[...]
2022-12-12
[7]
웹사이트
tmpfs.txt
https://www.kernel.o[...]
2010-03-16
[8]
웹사이트
Creating Named Shared Memory
http://msdn.microsof[...]
[9]
웹사이트
Boost.Interprocess C++ Library
http://www.boost.org[...]
[10]
웹사이트
QSharedMemory Class Reference
http://doc.qt.io/arc[...]
[11]
웹사이트
Shared Memory Functions in PHP-API
http://www.php.net/m[...]
[12]
웹사이트
CUDAプログラミングの基本 / パート II - カーネル | NVIDIA
https://http.downloa[...]
[13]
웹사이트
Documentation of shm_open
http://www.opengroup[...]
[14]
서적
UNIX systems programming: communication, concurrency, and threads
https://books.google[...]
Prentice Hall PTR
2011-05-13
[15]
웹사이트
Shared memory facility
http://www.opengroup[...]
[16]
서적
UNIX Network Programming, Volume 2, Second Edition: Interprocess Communications.
Prentice Hall PTR
[17]
웹사이트
Creating Named Shared Memory - Windows applications | Microsoft Docs
https://docs.microso[...]
[18]
웹사이트
CreateSharedMemory function (Windows)
https://web.archive.[...]
[19]
웹사이트
LSA_CREATE_SHARED_MEMORY (ntsecpkg.h) - Win32 apps | Microsoft Learn
https://learn.micros[...]
[20]
웹사이트
Chapter 16. Boost.Interprocess - 1.80.0
https://www.boost.or[...]
[21]
웹사이트
QSharedMemory Class Reference
http://qt-project.or[...]
[22]
웹사이트
PHP 共有メモリ関数
http://www.php.net/m[...]
[23]
웹사이트
MemoryMappedFile Class (System.IO.MemoryMappedFiles) | Microsoft Docs
https://docs.microso[...]
[24]
서적
Advanced Computer Architecture and Parallel Processing
https://archive.org/[...]
Wiley-Interscience
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com